// ****************************************************

// 由于bug的存在，让我们不得不考虑，微服务挂掉的问题如何解决
// 挂掉的原因很多，网络，异常等等
// 解决方案心跳检测+过期时间
// 过期时间就是该服务器响应时间是否过期，过期后应当拔掉该服务
// 心跳检测时间可以检验服务每段时间重新注册保证服务器能够提供最新的功能

// ****************************************************

// ****************************************************

// 负载均衡
// 负载均衡是传输请求负载或维持高可用性的一种方式

// 基本原理
// 任何单个流程应用程序的可用性和扩展都存在限制。
// 如果应用程序因任何原因死亡，您将无法再处理请求。
// 如果有足够的请求负载发送到应用程序，它可能会开始缓慢响应或根本不响应。
// 通过发送请求至多个应用程序副本可以解决这些问题。

// 解决办法
// Micro通过选择器接口进行客户端负载平衡，
// 以在任意数量的服务节点上传播请求。当服务启动时，
// 它将服务发现注册为具有唯一地址和ID的服务节点。在发出请求时，
// Micro客户端使用选择器来决定向哪个节点发出请求。选择器使用服务注册表查找服务的节点，
// 然后使用负载均衡策略（例如：随机哈希或循环法）选择要发送请求的节点。

// ****************************************************
// 特性
// Go Micro抽象出分布式系统的细节。以下是主要功能。

// 服务发现 - 通过服务发现自动注册和名称解析
// 负载平衡 - 基于发现构建的服务的智能客户端负载平衡
// 同步通信 - 基于RPC的通信，支持双向流
// 异步通信 - 为事件驱动架构内置的Pub/Sub接口
// 消息编码 - 基于带有protobuf和json的内容类型的动态编码
// 服务接口 - 所有功能都打包在一个简单的高级界面中，用于开发微服务
// Go Micro支持服务和功能编程模型。请继续阅读以了解更多信息。

// 插件
// Go-micro使用Go界面进行抽象。由于这个原因，底层实现可以被换出。

// 我们提供了开箱即用的默认设置。

// Consul或mDNS服务发现
// 随机散列客户端负载平衡
// JSON-RPC 1.0和PROTO-RPC消息编码
// HTTP通信机制
// ****************************************************

// 文档中很多都是过时的命令
// 下面命令还可以使用
// Micro Run
// micro run命令管理微服务的生命周期。它获取源代码，构建二进制文件并执行它。这是一个可用于本地开发的简单工具。如果没有指定参数，则微运行作为可以管理其他服务的服务来运行。

// 注意：默认运行时（Go）需要设置PATH和GOPATH中的Go二进制文件。

// 概述
// Run
// micro run github.com/service/foo
// Status
// micro run -s github.com/service/foo
// Kill
// micro run -k github.com/service/foo
// 运行服务管理
// micro run
// 推迟运行服务管理
// micro run -x github.com/service/foo
// 运行并重新启动
// micro run -r github.com/service/foo
// 运行并更新源代码
// micro run -u github.com/service/foo
// 使用帮助
// NAME:
//    micro run - Run the micro runtime

// USAGE:
//    micro run [command options] [arguments...]

// OPTIONS:
//    -k	Kill service
//    -r	Restart if dies. Default: false
//    -u	Update the source. Default: false
//    -x	Defer run to service. Default: false
//    -s	Get service status
// TODO
// [ ]支持接受args和env变量的服务
// [ ]添加服务接口go-run
// [ ]支持Go以外的可配置运行时
// [ ]插件支持重建
// [ ]守护进程？
// [ ]监控内存消耗并kill？
// [ ]chroot的进程？
// ****************************************************
